//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Readme.html
// 文件名   : ContainerAdapters.h
// 作者     : Aiye
// 日期     : 2025/9/7 20:02
// 邮箱     : 2878548868@qq.com
// 摘要     : 容器适配器
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef README_HTML_CONTAINERADAPTERS_H
#define README_HTML_CONTAINERADAPTERS_H
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <vector>

/**
 * @brief 栈 先进后出 只允许在在栈顶进行插入和删除操作
 */
class Stack
{
public:
    Stack()
    {
        std::stack<int> nStk1{}; // 默认使用deque
        std::stack<int , std::vector<int>> nStk2{}; // 使用vctor作为底层容器
        std::stack<int , std::list<int>> nStk3{}; // 使用list作为底层容器

        nStk1.push(1); // 压入元素1
        nStk1.push(2); // 压入元素2
        nStk1.push(3); // 压入元素3

        std::cout << "Top element: " << nStk1.top() << std::endl; // 输出3

        nStk1.pop(); // 弹出顶层元素
        if (!nStk1.empty())
        {
            std::cout << "Stack size:" << nStk1.size() << std::endl; // 输出2
        }

        nStk1.emplace(4); // 直接在栈顶构造
    }
};

/**
 * @brief 队列，先进先出
 */
class Queue
{
public:
    Queue()
    {
        std::queue<int> nQue{}; // 默认使用deque
        std::queue<int, std::vector<int>> nQue1{}; // 使用vector作为顶层容器

        nQue.push(1); // 入队
        nQue.push(2); // 入队
        nQue.push(3); // 入队

        std::cout << "Front:" << nQue.front() << std::endl; // 输出1
        std::cout << "Back:" << nQue.back() << std::endl; // 输出3

        nQue.pop(); // 移除1

        if (!nQue.empty())
        {
            std::cout << "Queue size: " << nQue.size() << std::endl; // 输出 2
        }

        nQue.emplace(4); // 在队尾构造
    }
};

/**
 * @brief 按优先级排列的队列适配器，优先级最高的位于队首
 */
class PriorityQueue
{
public:
    PriorityQueue()
    {
        std::priority_queue<int> npQue1{}; // 默认deque 最大值排序
        std::priority_queue<int , std::vector<int> , std::greater<>> npQue2{};

        std::function<bool(int ,int)> compare = [](int a, int b)
        {
            return a%10 > (b%10);
        };

        std::priority_queue<int , std::vector<int> ,compare> npQue3{}; // 自定义排序方式

        // 剩下的操作和queue几乎一样

    }
};
#endif //README_HTML_CONTAINERADAPTERS_H